package com.erp.erp_servers.warehouse.imp;

import com.erp.erp_dao.warehouse.ISellOutStockDetailDao;
import com.erp.erp_dao.warehouse.IStockDao;
import com.erp.erp_dao.warehouse.ITransferDetailDao;
import com.erp.erp_entitys.warehouse.entity.PlanInstoreProductEntity;
import com.erp.erp_entitys.warehouse.entity.SellOutStockDetailEntity;
import com.erp.erp_entitys.warehouse.entity.StockEntity;
import com.erp.erp_entitys.warehouse.entity.TransferDetailEntity;
import com.erp.erp_entitys.warehouse.req.*;
import com.erp.erp_entitys.warehouse.rsp.*;
import com.erp.erp_servers.warehouse.IStockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * @ClassName : StockServiceImp
 * @Description : 库存表实现类
 * @Author : lst
 * @Date: 2020-07-15 08:16
 */
@Service
public class StockServiceImp implements IStockService {

    /**
     * 库存表接口
     */
    private final IStockDao iStockDao;

    /**
     * 调拨产品接口
     */
    private final ITransferDetailDao transferDao;

    /**
     * 销售出库产品接口
     */
    private final ISellOutStockDetailDao sellOutStockDetailDao;

    @Autowired
    public StockServiceImp(IStockDao iStockDao,
                           ITransferDetailDao transferDao,
                           ISellOutStockDetailDao sellOutStockDetailDao) {
        this.iStockDao = iStockDao;
        this.transferDao = transferDao;
        this.sellOutStockDetailDao = sellOutStockDetailDao;
    }

    /**
     * 获取库存信息
     * @param req 查询参数
     * @return 库存集合
     */
    @Override
    public List<StockEntity> queryAll(StockEntity req) {
        return iStockDao.queryAll(req);
    }

    /**
     * 新增库存数据
     * @param stock 实例对象
     * @return id
     */
    @Override
    public int insert(StockEntity stock) {
        return iStockDao.insert(stock);
    }

    /**
     * 查询库存集合
     * @param req 查询参数
     * @return 库存集合
     */
    @Override
    public List<StockEntity> getStockList(StockReq req) {
        return iStockDao.getStockList(req);
    }

    /**
     * 查询库存账龄集合
     * @param req 查询参数
     * @return 库存集合
     */
    @Override
    public List<StockEntity> getStockAccountAgeList(StockAccountAgeReq req) {
        return iStockDao.getStockAccountAgeList(req);
    }

    /**
     * 获取库存信息
     * @param req 查询条件
     * @return 库存集合
     */
    @Override
    public List<StockEntity> getStockListByQuery(SelectStockReq req) {
        return iStockDao.getStockListByQuery(req);
    }

    /**
     * 通过id获取库存对象
     * @param id 库存id
     * @return 库存对象
     */
    @Override
    public StockEntity getStockById(Integer id) {
        return iStockDao.getStockById(id);
    }

    /**
     * 修改数据
     *
     * @param stock 实例对象
     * @return 影响行数
     */
    @Override
    public int update(StockEntity stock) {
        return iStockDao.update(stock);
    }

    /**
     * 修改数据
     *
     * @param stock 实例对象
     * @return 影响行数
     */
    @Override
    public int updateStockInfo(StockEntity stock) {
        return iStockDao.updateStockInfo(stock);
    }

    /**
     * 通过库存对象获取库存信息集合
     * @param req 库存对象
     * @return 库存对象集合
     */
    @Override
    public List<StockEntity> getStockListByStock(StockEntity req) {
        return iStockDao.getStockListByStock(req);
    }

    /**
     * 获取库存产品集合
     * @param req 查询入参
     * @return 库存集合
     */
    @Override
    public List<StockEntity> getStockProductList(QueryStockProductReq req) {
        return iStockDao.getStockProductList(req);
    }

    /**
     * 获取同一批库存数据（批次号，产品编码  规格编码，仓库id  合同号 如果都相同 则为同一组）
     * @param req 查询条件
     * @return 查询结果
     */
    @Override
    public List<StockEntity> getTheSameStockInfo(StockEntity req) {
        return iStockDao.getTheSameStockInfo(req);
    }

    /**
     * 更新库存、调拨、销售出库明细的各种费用信息
     * 海运费、运输代理费、美国仓储操作费、关税、分摊费用单价
     * @param req 备货入库产品信息
     */
    @Override
    public void updateStockAndTransferAndSaleFee(PlanInstoreProductEntity req) {
        //更新库存、调拨、销售出库明细的各种费用信息
        //根据产品编码、规格编码、批次号获取库存数据
        //1.更新调拨产品表信息
        TransferDetailEntity transferDetailReq = new TransferDetailEntity();
        //产品编码
        transferDetailReq.setProductCode(req.getProductCode());
        //规格编码
        transferDetailReq.setSpecificationCode(req.getSpecificationCode());
        //批次号
        transferDetailReq.setLotNo(req.getLotNo());
        //数据有效
        transferDetailReq.setValid(1);
        List<TransferDetailEntity> transferDetailList = transferDao.queryAll(transferDetailReq);
        if(!CollectionUtils.isEmpty(transferDetailList)){
            for(TransferDetailEntity transferDetail : transferDetailList){
                //海运费
                transferDetail.setShippingFee(req.getShippingFee());
                //运输代理费
                transferDetail.setTransferAgencyFee(req.getTransferAgencyFee());
                //美国仓储操作费
                transferDetail.setStorageOperationFee(req.getStorageOperationFee());
                //关税
                transferDetail.setTariff(req.getTariff());
                //分摊费用单价
                transferDetail.setShareCostPrice(req.getShareCostPrice());

                //更新库存信息
                transferDao.update(transferDetail);
            }
        }

        //2.更新库存表信息
        StockEntity stockReq = new StockEntity();
        //产品编码
        stockReq.setProductCode(req.getProductCode());
        //规格编码
        stockReq.setSpecificationCode(req.getSpecificationCode());
        //批次号
        stockReq.setLotNo(req.getLotNo());
        //数据有效
        stockReq.setValid(1);
        List<StockEntity> stockList = iStockDao.queryAll(stockReq);
        if(!CollectionUtils.isEmpty(stockList)){
            for(StockEntity stock : stockList){
                //海运费
                stock.setShippingFee(req.getShippingFee());
                //运输代理费
                stock.setTransferAgencyFee(req.getTransferAgencyFee());
                //美国仓储操作费
                stock.setStorageOperationFee(req.getStorageOperationFee());
                //关税
                stock.setTariff(req.getTariff());
                //分摊费用单价
                stock.setShareCostPrice(req.getShareCostPrice());

                //更新库存信息
                iStockDao.update(stock);
            }
        }

        //3.更新销售出库产品表信息
        SellOutStockDetailEntity sellOutStockDetailReq = new SellOutStockDetailEntity();
        //产品编码
        sellOutStockDetailReq.setProductCode(req.getProductCode());
        //规格编码
        sellOutStockDetailReq.setSpecificationCode(req.getSpecificationCode());
        //批次号
        sellOutStockDetailReq.setLotNo(req.getLotNo());
        //数据有效
        sellOutStockDetailReq.setValid(1);
        List<SellOutStockDetailEntity> sellOutStockDetailList = sellOutStockDetailDao.queryAll(sellOutStockDetailReq);
        if(!CollectionUtils.isEmpty(sellOutStockDetailList)){
            for(SellOutStockDetailEntity outStockDetail : sellOutStockDetailList){
                //海运费
                outStockDetail.setShippingFee(req.getShippingFee());
                //运输代理费
                outStockDetail.setTransferAgencyFee(req.getTransferAgencyFee());
                //美国仓储操作费
                outStockDetail.setStorageOperationFee(req.getStorageOperationFee());
                //关税
                outStockDetail.setTariff(req.getTariff());
                //分摊费用单价
                outStockDetail.setShareCostPrice(req.getShareCostPrice());

                //更新库存信息
                sellOutStockDetailDao.update(outStockDetail);
            }
        }

    }


    // ************************************外销合同*******************************************

    /**
     * 通过条件查询
     *
     * @param req 条件对象
     * @return 对象列表
     */
    @Override
    public List<ContractInfoRsp> getContractAndStockInfo(ContractInfoReq req) {
        return iStockDao.getContractAndStockInfo(req);
    }

    /**
     * 通过实体作为筛选条件查询
     *
     * @param id 销售主表id
     * @return 对象列表
     */
    @Override
    public List<ImportContractInfoRsp> getContractProductInfo(Integer id) {
        return iStockDao.getContractProductInfo(id);
    }


    /**
     * 根据销售合同id集合获取库存集合信息
     * @param ids 销售id集合
     * @return 库存集合信息
     */
    @Override
    public List<ImportContractInfoRsp> getStockListByContractIds(List<Integer> ids) {
        return iStockDao.getStockListByContractIds(ids);
    }




    //************************************仓库字典*************************************************

    /**
     * 获取所有字典信息
     * @param req 查询参数
     * @return 字典信息
     */
    @Override
    public List<DictionaryInfoRsp> getDictionaryInfo(DictionaryInfoReq req) {
        return iStockDao.getDictionaryInfo(req);
    }







    //*************************************************产品信息******************************************************

    /**
     * 获取产品信息
     * @param req 查询入参实体
     * @return 查询结果
     */
    @Override
    public List<ProductInfoRsp> getProductInfoByQuery(ProductInfoReq req) {
        return iStockDao.getProductInfoByQuery(req);
    }

    /**
     * 获取产品信息
     * @param req 查询入参实体
     * @return 查询结果
     */
    @Override
    public List<ProductInfoRsp> getProductInfoByConcat(ProductInfoReq req) {
        return iStockDao.getProductInfoByConcat(req);
    }

    /**
     * 根据产品编码规格编码获取规格信息
     * @param productCode 产品编码
     * @param specificationCode 规格编码
     * @return 规格信息
     */
    @Override
    public ProductInfoRsp getProductInfoByCode(String productCode, String specificationCode) {
        return iStockDao.getProductInfoByCode(productCode, specificationCode);
    }

    /**
     * 获取产品配件信息
     * @param req 查询入参实体
     * @return 规格配件信息
     */
    @Override
    public List<ProductInfoRsp> getSpecPartsInfoByConcat(ProductInfoReq req) {
        return iStockDao.getSpecPartsInfoByConcat(req);
    }

    /**
     * 根据产品规格编码获取对应配件信息
     * @param code 产品规格编码
     * @param productCode 产品编码
     * @return 配件信息
     */
    @Override
    public List<ProductPartsInfoRsp> getProductPartsInfoBySpecNo(String code, String productCode) {
        return iStockDao.getProductPartsInfoBySpecNo(code, productCode);
    }

    /**
     * 根据产品规格编码获取对应附件信息
     * @param productCode 产品编码
     * @return 对应附件信息
     */
    @Override
    public List<ProductAnnexInfoRsp> getProductAnnexInfoByProductCode(String productCode) {
        return iStockDao.getProductAnnexInfoByProductCode(productCode);
    }


    //*************************************************公司信息******************************************************

    /**
     * 获取公司信息
     * @return 公司信息
     */
    @Override
    public List<CompanyInfoRsp> getCompanyInfo() {
        return iStockDao.getCompanyInfo();
    }







    //*************************************************银行信息******************************************************

    /**
     * 获取银行信息通过公司编码
     * @param code 公司编码
     * @return  银行信息
     */
    @Override
    public List<BankAccountRsp> getBankInfo(String code) {
        return iStockDao.getBankInfo(code);
    }


    /**
     * 获取部门信息通过公司编码
     * @param code 公司编码
     * @return  部门信息
     */
    @Override
    public List<DepartmentInfoRsp> getDepartmentInfo(String code) {
        return iStockDao.getDepartmentInfo(code);
    }


    @Override
    public Integer getStockProduct(String productCode) {
        return iStockDao.getStockProduct(productCode);
    }
}
